package model;

import java.sql.SQLException;
import java.util.ArrayList;

/**
 * Repräsentiert die Verbindung zur Datenbank
 * 
 * @author Jonas Gutermuth
 */
@SuppressWarnings("serial")
public class FelderRepository extends ArrayList<Feld> {

	private static FelderRepository felderRepository = null;
	private static DatenbankSchnittstelle datenbankSchnittstelle;

	/**
	 * Repräsentiert die Verbindung zur Datenbank
	 * 
	 * @throws ClassNotFoundException
	 *             Klasse nicht gefunden.
	 * @throws SQLException
	 *             SQL-Exception
	 */
	private FelderRepository() throws ClassNotFoundException, SQLException {

		datenbankSchnittstelle = DatenbankSchnittstelle.getInstance();
		addArray(datenbankSchnittstelle.getFelder());

		System.out.println("Felder Repository geladen");
	}

	/**
	 * Fügt dem FelderRepository ein Array von Feldern hinzu.
	 * 
	 * @param felder
	 *            die Felder
	 */
	private void addArray(Feld[] felder) {
		for (int i = 0; i < felder.length; i++) {
			this.add(felder[i]);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.util.ArrayList#get(int)
	 */
	public Feld get(int index) {
		Feld feld = super.get(index);

		// Prüfen ob noch Aktuell

		return feld;
	}

	/**
	 * Speichert das Feld in der Datenbank und im Repository. (Für neue
	 * Versionen eines bestehenden Felds.)
	 * 
	 * @param feld
	 *            das zu speichernde Feld
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	public void saveFeld(Feld feld) throws SQLException, ClassNotFoundException {
		String[][] db_werte = new String[2][6];
		// spaltennamen
		db_werte[0][0] = "id";
		db_werte[0][1] = "typ";
		db_werte[0][2] = "name";
		db_werte[0][3] = "dez2relevant";
		db_werte[0][4] = "aenderung";
		db_werte[0][5] = "wert";
		// werte
		db_werte[1][0] = "" + feld.getId();
		db_werte[1][1] = "" + feld.getTyp();
		db_werte[1][2] = feld.getName();
		if (feld.isDez2relevant()) {
			db_werte[1][3] = "1";
		} else {
			db_werte[1][3] = "0";
		}
		db_werte[1][4] = "" + feld.getAenderung();
		db_werte[1][5] = feld.getWert();
		// ebene in die datenbank eintragen
		datenbankSchnittstelle.insert("feld", db_werte);

		this.add(feld);
	}


	/**
	 * Erstellt ein neues Feld und speichert es in der Datenbank und im
	 * Repository. (Nicht für neue Versionen eines bestehenden Felds.)
	 * 
	 * @param typ der Feldtyp
	 * @param name der Feldname
	 * @param dez2relevant die Relevanz des Feldes für das Dezernat2
	 * @param wert der Feldwert
	 * @return das Feld
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	public Feld newFeld(int typ, String name, boolean dez2relevant, String wert, long aenderung)
			throws SQLException, ClassNotFoundException {
		String[][] db_werte = new String[2][5];
		// spaltennamen
		db_werte[0][0] = "typ";
		db_werte[0][1] = "name";
		db_werte[0][2] = "dez2relevant";
		db_werte[0][3] = "aenderung";
		db_werte[0][4] = "wert";
		// werte
		db_werte[1][0] = "" + typ;
		db_werte[1][1] = name;
		if (dez2relevant) {
			db_werte[1][2] = "1";
		} else {
			db_werte[1][2] = "0";
		}
		db_werte[1][3] = "" + aenderung;
		db_werte[1][4] = wert;
		// ebene in die datenbank eintragen
		int id = datenbankSchnittstelle.insert("feld", db_werte);

		Feld feld = new Feld(id, typ, name, dez2relevant, aenderung, wert);
		this.add(feld);
		return feld;
	}
	/**
	 * Liefert alle Felder mit der übergebenen ID zurück.
	 * 
	 * @param id
	 *            die ID der geforderten Felder
	 * @return die Felder
	 */
	public Feld[] getFeldNachId(int id) {
		ArrayList<Feld> list = new ArrayList<Feld>();
		for (int i = 0; i < this.size(); i++) {
			if (this.get(i).getId() == id) {
				list.add(this.get(i));
			}
		}
		return list.toArray(new Feld[0]);
	}

	/**
	 * Liefert das neueste Feld mit der übergebenen ID zurück.
	 * 
	 * @param id
	 *            die ID des geforderten Feldes
	 * @return das neueste Feld mit übergebener ID
	 */
	public Feld getNeustesFeldNachId(int id) {
		Feld f = null;
		for (int i = 0; i < this.size(); i++) {
			if (this.get(i).getId() == id) {
				if (f == null) {
					f = this.get(i);
				} else {
					if (f.getAenderung() < get(i).getAenderung()) {
						f = this.get(i);
					}
				}
			}
		}
		return f;
	}

	/**
	 * Liefert eine Instanz des Repositorys zurück, damit dies nur einmal
	 * initiert wird.
	 * 
	 * @return Instanz von FelderRepository
	 * @throws ClassNotFoundException
	 *             Klasse nicht gefunden
	 * @throws SQLException
	 *             SQL-Exception
	 */
	public static FelderRepository getInstance() throws ClassNotFoundException,
			SQLException {
		if (felderRepository == null) {
			felderRepository = new FelderRepository();
		}
		return felderRepository;
	}

}
